package com.riber.student.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.riber.student.bo.SelectCourseBo;
import com.riber.student.common.ResponseResult;
import com.riber.student.dao.RcCourseMapper;
import com.riber.student.dao.RcStudentMapper;
import com.riber.student.entity.RcCourse;
import com.riber.student.entity.RcStudentCourse;
import com.riber.student.dao.RcStudentCourseMapper;
import com.riber.student.service.IRcStudentCourseService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.riber.student.vo.output.StudentCourseVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author riber
 * @since 2022-10-25
 */
@Service
public class RcStudentCourseServiceImpl extends ServiceImpl<RcStudentCourseMapper, RcStudentCourse> implements IRcStudentCourseService {
    @Autowired
    private RcCourseMapper courseMapper;
    @Autowired
    private RcStudentMapper studentMapper;
    @Autowired
    private RcStudentCourseMapper scMapper;

    @Override
    public ResponseResult getStudentScore(Integer studentId) {
        return ResponseResult.createSuccess(scMapper.getStudentScore(studentId));
    }

    @Override
    public ResponseResult showCourseTimeTable(Integer studentId) {
        return ResponseResult.createSuccess(scMapper.getCourseTimeTable(studentId));
    }

    @Override
    public ResponseResult delCourse(Integer scId) {
        //使用 查询课程id
        RcStudentCourse studentCourse = scMapper.selectOne(new QueryWrapper<RcStudentCourse>().eq("sc_id", scId));
        // 使用课程id 获取这个课程数据
        RcCourse rcCourse = courseMapper.selectById(studentCourse.getScCourseId());
        //修改选修人数
        rcCourse.setCourseSelectedCount(rcCourse.getCourseSelectedCount() - 1);
        //更新选修人数
        courseMapper.updateById(rcCourse);
        //删除学生选修数据
        if (scMapper.delete(new QueryWrapper<RcStudentCourse>().eq("sc_id", scId)) > 0) {
            return ResponseResult.createSuccess("okok 可以");
        }
        return ResponseResult.createFail("nook");
    }

    @Override
    public ResponseResult getStudentCourse(Integer studentId) {
        List<StudentCourseVo> list = scMapper.getStudentCourse(studentId);
        return ResponseResult.createSuccess(list);
    }

    @Override
    public ResponseResult addStudentCourse(Integer courseId, Integer studentId) {
        //1 判断课程是否存在
        // 查询这个年级的课程的值
        RcCourse course = courseMapper.selectOne(
                new QueryWrapper<RcCourse>()
                        .eq("course_id", courseId));
        if (course == null) {
            //没有这个课程
            return ResponseResult.createFail("该课程不存在");
        }
        //2 学生id正确
        // 查询学员和班级 进行链表查询 年级的值 有值就代表存在该学员
        Integer studentGrade = studentMapper.getStudentClassGrade(studentId);
        if (studentGrade == null) {
            return ResponseResult.createFail("该学生不存在");
        }
        //3 学生的年级和课程年级需要一致
        // 利用上面两次查询结果 判断是否一致得出学生的 年级和 课程年级 是否一致
        if (!studentGrade.equals(course.getCourseGrade())) {
            // 课程年级和学生的年级不一致
            return ResponseResult.createFail("该课程年级不同,无法选修");
        }
        //4 学生是否已有选择这个课程
        RcStudentCourse rcStudentCourse = scMapper.selectOne(
                new QueryWrapper<RcStudentCourse>()
                        .eq("sc_student_id", studentId)
                        .eq("sc_course_id", courseId));
        if (rcStudentCourse != null) {
            //学生已选择这个课程
            return ResponseResult.createFail("该课程已选修,无法重复选择");
        }
        //5 课程人数已超过最大选课人数
        RcCourse courseCount = courseMapper.selectOne(
                new QueryWrapper<RcCourse>()
                        .eq("course_id", courseId)
                        .apply("course_selected_count<course_max_size"));
        if (courseCount == null) {
            //学生已选择该课程
            return ResponseResult.createFail("该课程人数已满,无法选修");
        }
        //6 上课时间
        // 查询到学生现有的课程时间
        List<String> courseTimeList = scMapper.getStudentCourseTime(studentId);
        // 选修课时间 2022/10/27 20:46
        String courseTime = course.getCourseTime();
        for (String s : courseTimeList) {
            // 课程时间是否重复
            if (SelectCourseBo.check(courseTime, s)) {
                return ResponseResult.createFail("该课程和已有课程四件重复,无法选修");
            }
        }
        //7 新增
        RcStudentCourse studentCourse = new RcStudentCourse(studentId, courseId);
        if (scMapper.insert(studentCourse) > 0) {
            //8 修改被选修的课程 人数+1
            // 使用已查询好的课程数据对象进行修改
            course.setCourseSelectedCount(course.getCourseSelectedCount() + 1);
            courseMapper.updateById(course);
            return ResponseResult.createSuccess("课程选修成功");
        }
        return ResponseResult.createFail("课程选修失败");
    }
}
